package tree

import "fmt"

// Node 定义结构体
//值接收者 vs 指针接收者
//1、要改变内容必须使用指针接收者
//2、结构过大也考虑使用指针接收者
//3、一致性：如有指针接收者，最好都是指针接收者
//4、值接收者是go语言特有的
//5、值/指针接收者均可接收值/指针
type Node struct {
	Value       int
	Left, Right *Node
}

// Print 定义结构体的方法,显示定义和命名方法接收者
func (node Node) Print() {
	fmt.Print(node.Value, " ")
}

// SetValue 只有使用指针才可以改变结构内容
//nil指针也可以调用方法！
func (node *Node) SetValue(value int) {
	if node == nil {
		fmt.Println("Setting value to nil node. Ignore.")
		return
	}
	node.Value = value
}

// CreateNode 1、使用自定义工厂函数
//2、注意返回了局部变量的地址
func CreateNode(value int) *Node {
	return &Node{Value: value}
}
